core-more.bash

#!/usr/bin/env bash

##
#
# @tip Download all changes
function core_update(){
    is_project_dir || return;
    

    msg_status "Downloading"
    git fetch
    # msg_mistake "downloading tempoararily disabled"
    msg_status "Download complete"
    msg_header "Current status"

    branches_status

    behindCount="$(cur_branch_behind_count)"

    if [[ behindCount -gt 0 ]]; then
        msg
        msg_header "Merge..."
        msg "${cMark}$(cur_branch)${cOff} is ${behindCount} commits behind."

        changed_files_array changedFiles;
        changeCount="${#changedFiles[@]}";
        hasChanges=false
        
        if [[ $changeCount -gt 0 ]];then
            msg "${cWarn}${changeCount} local files uncommitted${cOff}."
            hasChanges=true
            if prompt_yes_or_no "Commit now?";then
                run more check
                prompt_or_quit "Commit msg" message || return
                git add .
                git commit -m "$message"
                hasChanges=false
            fi
        fi

        prompt_yes_or_no "Merge ${behindCount} commits into local ${cMark}$(cur_branch)${cOff}?" \
            || return

        git stash
        git pull
        git stash apply
        msg
    fi

    files_with_conflicts conflictingFiles
    if [[ "${#conflictingFiles[@]}" -eq 0 ]];then 
        run more check
        msg "$(cur_branch) is now up to date"
        return
    fi

    debug "run merge conflicts"  "line 57 core-more.bash"
    run merge conflicts
}


##
# Preserves your commit history & creates a new commit for the rollback
#
# @tip Rollback to a previous commit
function core_revert(){
    is_project_dir || return;
    msg
    
    # @TODO Are there unsaved changes?
    # if yes, prompt
        # There are unsaved changes, what would you like to do?
        # 1. Save, then revert
        # 2. Delete unsaved changes, then revert
        # 3. Revert, then apply unsaved changes
    # if no, continue

    # <ctrl+F> [PRETTY FORMATS] on https://git-scm.com/docs/git-log
    # git log --graph --pretty=format:'%h :: %d% -- %s (%cr) ::: <%an>' --abbrev-commit -n 10
    histStr="$(git log --pretty=format:'%<(20,trunc)%h%<(30,trunc)%cr%<(30,trunc)%an%s' --abbrev-commit -n 10)"
    str_split_line "${histStr}" hist
    i=0;
    chooseCommand="prompt_choose choice '#Choose Version' \\\\\n"
    for commit in "${hist[@]}"; do

        # hash="$(sed -e "s/:::::.*//" <<< "${commit}")"
        descript="${commit:80}"
        descript="$(echo -e "${descript}" | sed -e 's/[[:space:]]*$//')"
        # msg -n "\n${descript}\n  -";

        hash="${commit:0:20}"
        hash="${hash%%*( )}"
        hash="$(echo -e "${hash}" | sed -e 's/[[:space:]]*$//')"
        # echo -n "${hash}"
        time="${commit:20:30}"
        time="$(echo -e "${time}" | sed -e 's/[[:space:]]*$//')"
        # echo -n "${time}";
        author="${commit:50:30}"
        author="$(echo -e "${author}" | sed -e 's/[[:space:]]*$//')"
        # echo -n " by ${author}";

        key="${descript}\n       - ${time} by ${author}"

        # chooseCommand+="'${key}' '${hash}' "
        # msg
        key="${key//\"/\\\"}"
        # msg "${key}"
        # continue;
        chooseCommand+="\"${hash}\" \"${hash}\" \"${key}\"  \\\\\n"

        # msg "\n\n"
        # echo "CMD::${hash}, ${key}"

        # msg
        # echo "${commit}\n"
    done
    chooseCommand+="'#This feature is experimental';"

    chooseCommand=$(msg "$chooseCommand");

    msg_status "expiremental feature"
	
    eval "$chooseCommand" \
        || return;

    # @TODO Use the hashes as keys so the commit message can be shown here as well
    header "Revert to commit ${choice}"

    git revert --no-commit "${choice}"..HEAD
    run core save

}